package org.dxy.trigger.listener.workorder;

import com.google.common.eventbus.Subscribe;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dxy.domain.event.workorder.ReworkOrderCreatedEvent;
import org.dxy.trigger.listener.EventListener;
import org.springframework.stereotype.Component;

/**
 * 返工工单创建事件监听器
 * <p>处理返工工单创建后的业务逻辑，如：
 * <ul>
 *   <li>生成返工专用的工艺路线</li>
 *   <li>通知质检部门</li>
 *   <li>记录返工原因和历史</li>
 *   <li>更新原工单的返工状态</li>
 * </ul>
 * 
 * @author dxy
 * @createTime 2025/12/01 10:00
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ReworkOrderCreatedEventListener implements EventListener<ReworkOrderCreatedEvent> {

    @Override
    @Subscribe
    public void onEvent(ReworkOrderCreatedEvent event) {
        log.info("处理返工工单创建事件 - 返工工单ID: {}, 原工单ID: {}", 
                event.reworkOrderId(), event.originalOrderId());
        
        try {
            // 1. 生成返工专用工艺路线
            generateReworkRoute(event);
            
            // 2. 通知相关部门
            notifyDepartments(event);
            
            // 3. 记录返工历史
            recordReworkHistory(event);
            
            // 4. 更新原工单状态
            updateOriginalOrderStatus(event);
            
            log.info("返工工单创建事件处理完成 - 返工工单ID: {}", event.reworkOrderId());
            
        } catch (Exception e) {
            log.error("处理返工工单创建事件失败 - 返工工单ID: {}, 错误: {}", 
                     event.reworkOrderId(), e.getMessage(), e);
            // 这里可以考虑发送告警或者重试机制
        }
    }
    
    /**
     * 生成返工专用工艺路线
     * <p>基于原工单的工艺路线和返工原因，生成优化的返工路线
     */
    private void generateReworkRoute(ReworkOrderCreatedEvent event) {
        log.info("为返工工单生成专用工艺路线 - 返工工单ID: {}, 原工单ID: {}", 
                event.reworkOrderId(), event.originalOrderId());
        
        // TODO: 实现工艺路线生成逻辑
        // 1. 获取原工单的工艺路线
        // 2. 分析返工原因，确定需要重做的工序
        // 3. 生成优化的返工路线（可能跳过某些工序）
        // 4. 保存返工路线并关联到返工工单
        
        log.debug("返工工艺路线生成完成 - 返工工单ID: {}", event.reworkOrderId());
    }
    
    /**
     * 通知相关部门
     * <p>通知质检、生产、计划等相关部门有新的返工工单
     */
    private void notifyDepartments(ReworkOrderCreatedEvent event) {
        log.info("通知相关部门返工工单创建 - 返工工单ID: {}", event.reworkOrderId());
        
        // TODO: 实现部门通知逻辑
        // 1. 通知质检部门：需要重新检验
        // 2. 通知生产部门：安排返工生产
        // 3. 通知计划部门：调整生产计划
        // 4. 可以通过消息队列、邮件、短信等方式通知
        
        log.debug("部门通知发送完成 - 返工工单ID: {}", event.reworkOrderId());
    }
    
    /**
     * 记录返工历史
     * <p>记录返工工单的创建历史，用于后续分析和追溯
     */
    private void recordReworkHistory(ReworkOrderCreatedEvent event) {
        log.info("记录返工历史 - 返工工单ID: {}, 原工单ID: {}", 
                event.reworkOrderId(), event.originalOrderId());
        
        // TODO: 实现返工历史记录逻辑
        // 1. 记录返工工单与原工单的关联关系
        // 2. 记录返工原因和时间
        // 3. 记录返工数量和相关信息
        // 4. 用于后续的质量分析和改进
        
        log.debug("返工历史记录完成 - 返工工单ID: {}", event.reworkOrderId());
    }
    
    /**
     * 更新原工单状态
     * <p>标记原工单已有返工工单，用于状态跟踪
     */
    private void updateOriginalOrderStatus(ReworkOrderCreatedEvent event) {
        log.info("更新原工单返工状态 - 原工单ID: {}, 返工工单ID: {}", 
                event.originalOrderId(), event.reworkOrderId());
        
        // TODO: 实现原工单状态更新逻辑
        // 1. 在原工单上标记已创建返工工单
        // 2. 记录返工工单ID用于关联查询
        // 3. 更新原工单的返工次数统计
        
        log.debug("原工单状态更新完成 - 原工单ID: {}", event.originalOrderId());
    }


}